- 最长回文子字符串
- 回文数字
- 最大多位数串
- 逆序整数
最长回文子字符串
题目
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
思路
显然所有的回文串都是对称的。长度为奇数回文串以最中间字符的位置为对称轴左右对称,而长度为偶数的回文串的对称轴在中间两个字符之间的空隙。可否利用这种对称性来提高算法效率呢?答案是肯定的。我们知道整个字符串中的所有字符,以及字符间的空隙,都可能是某个回文子串的对称轴位置。可以遍历这些位置,在每个位置上同时向左和向右扩展,直到左右两边的字符不同,或者达到边界。对于一个长度为n的字符串,这样的位置一共有n+n-1=2n-1个,在每个位置上平均大约要进行n/4次字符比较,于是此算法的时间复杂度是O(n^2)。
代码
|
|
回文数字
问题
Determine whether an integer is a palindrome. Do this without extra space.
技巧点
将原数字倒转一半,判断前一半数字是否相同
易错点
10及其倍数的处理
代码
|
|
最大多位数串
问题
设有n个正整数,将他们连接成一排,组成一个最大的多位整数。
如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
如:n=4时,4个整数7,13,4,246连接成的最大整数为7424613。
思路
本题可以理解为对N个数进行排序,只不过排序的标准不是数值的大小,而是两个字符串组合到一起转化成整形后的数值大小。
代码
|
|
注意点
- vector容器(构造函数参数,常用函数)
- sort函数(algorithm头文件)
逆序整数
题目
Given a 32-bit signed integer, reverse digits of an integer.
易错点
- 负数的逆序
- 逆序后发生溢出
代码
123456789101112131415161718192021222324class Solution {public:int reverse(int x) {int rx=0;int sign=0;if(x>=0){sign = 1;}else{sign = -1;x =-x;}while(x!=0){int digit = x%10;int old_rx = rx;rx = rx*10+digit;if(rx/10 != old_rx){return 0;}else{x = x/10;}}return rx*sign;}};